/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// TGUI - Texus's Graphical User Interface
// Copyright (C) 2012 Bruno Van de Velde (VDV_B@hotmail.com)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it freely,
// subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented;
//    you must not claim that you wrote the original software.
//    If you use this software in a product, an acknowledgment
//    in the product documentation would be appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such,
//    and must not be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source distribution.
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


#ifndef _TGUI_PANEL_INCLUDED_
#define _TGUI_PANEL_INCLUDED_

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

namespace tgui
{
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    struct TGUI_API Panel : public OBJECT, Group
    {
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Default constructor
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        Panel();


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Copy constructor
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        Panel(const Panel& copy);


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Destructor
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ~Panel();


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Overload of assignment operator
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        Panel& operator= (const Panel& right);


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Creates the panel.
        /// The width and height parameters constain the size before scaling.
        /// If you want the panel to have a background color then you should also adjust the last parameter.
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        bool load(unsigned int width, unsigned int height, const sf::Color& backgroundColor = sf::Color::Transparent);


        //////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Changes the size of the panel. Note that this function will undo all scaling.
        /// It is an alternative to setScale.
        //////////////////////////////////////////////////////////////////////////////////////////////////////
        void setSize(float width, float height);


        //////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Returns the size of the panel, unaffected by scaling.
        //////////////////////////////////////////////////////////////////////////////////////////////////////
        Vector2u getSize() const;


        //////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Returns the size of the panel, after the scaling transformation.
        //////////////////////////////////////////////////////////////////////////////////////////////////////
        Vector2f getScaledSize() const;


        //////////////////////////////////////////////////////////////////////////////////////////////////////
        /// \internal
        // Send the event to all underlying objects.
        //////////////////////////////////////////////////////////////////////////////////////////////////////
        void handleEvent(sf::Event& event, const float mouseX = 0, const float mouseY = 0);


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    private:


        //////////////////////////////////////////////////////////////////////////////////////////////////////
        // The objects inside the panel use this function to send their callbacks.
        // This function will alert the window (or any other parent of this panel) about the callback.
        //////////////////////////////////////////////////////////////////////////////////////////////////////
        void addCallback(Callback& callback);


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // The EventManager will call these functions to tell the panel about the event.
        // These events must be sent to the childs of the panel by it's own EventManager.
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        bool mouseOnObject(float x, float y);
        void objectUnfocused();


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // Because this struct is derived from sf::Drawable, you can just call the draw function from your sf::RenderTarget.
        // This function will be called and it will draw the panel on the render target.
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        void draw(sf::RenderTarget& target, sf::RenderStates states) const;


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    public:

        /// The background color of the Panel. The default is a transparent background (sf::Color::Transparent).
        sf::Color backgroundColor;


        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    private:

        sf::RenderTexture* m_RenderTexture;

        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


        friend struct Group;

        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    };

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#endif //_TGUI_PANEL_INCLUDED_
